UEFI 以前のブートシーケンス(レガシー)
いわゆる BIOS ブート
Hyper-V では第1世代と呼ばれている。
PC/AT アーキテクチャ限定
今は UEFI を使うべき。これは歴史的資料。
BIOS の設定による順序で、各ドライブで起動可能かどうかを確認する。
起動可能なドライブがHDDなど(大容量ブロックデバイス)であれば、先頭セクタのMBRの情報を読み出す。
FDの場合はHDDのMBRのパーティション決定後と同じ処理になる。
HDDの場合、MBRから起動可能なパーティションを選択する。 (拡張パーティションの場合もある(?))
パーティションの先頭セクタ(512Byte)の IPL としてシグネチャを確認する。 IPL の末尾2バイト (=0x1fe~0x1ff)は 0x55, 0xaa でなければならない。
シグネチャが異なる場合は、次のブートデバイスのチェックに行く。
IPL を 0x0000:0x7c00 に読み出し、CS=0x0000, PC=0x7c00 として 8086 モードで実行開始する。
極一部の BIOS では CS=0x7c00, PC=0x0000 としてしまう模様。(たぶん無視してもよい。)
8086 モードなので AMD64 のコードでは動かないことに注意。
8086 の機械語を生成するアセンブラまたはコンパイラが必要となる。
OSが起動するまでにブートローダーがやらなければならないこと
メモリの搭載量を確認する。(初期は 0x00500~0xa0000 までは使えるはず。)
Global Descriptor Table (GDT), Interrupt Descriptor Table (IDT) を設定する。
A20以上のアドレスバスを有効にして、32ビットのメモリ空間を利用できるようにする。
CPUの動作モードをリアルモード(16ビット)からプロテクトモード(32ビット)に変更する。
CPUの動作モードを32bitモードから64bitモードに変更する。
カーネルをロードする。
レジスタを初期化する。
カーネルの初期アドレスにジャンプする。
各種デバイスから OS のコードを読み出すためには BIOS だけでは不足で、デバイスドライバが必要とされる。
このため、BIOS でアクセス可能な領域から、最小限のカーネルとデバイスドライバを圧縮したものをメモリ上に取り込んで、そこからさらに実際のデバイスにアクセスするような手段が取られる。
UEFI では現代では標準的なデバイスに関しては一通りアクセスできるようになっていて、このような2段構えのブートは不要になっている。
注意事項
BIOS は 8086 モードでしか動かない。このため、CPU の動作モードが切り替わった後、一時的に 8086 モードにしてから BIOS を呼ぶような処理が必要となる。
BIOS はある程度標準化されているが、完全ではない。
関連
参考